package br.com.pucrs.tcc.rn;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.pucrs.tcc.bd.AlunoBD;
import br.com.pucrs.tcc.bd.AreaInteresseBD;
import br.com.pucrs.tcc.bd.CursoBD;
import br.com.pucrs.tcc.bd.ItemPriorizacaoBD;
import br.com.pucrs.tcc.bd.OrdemPriorizacaoBD;
import br.com.pucrs.tcc.ed.Curso;
import br.com.pucrs.tcc.ed.ItemPriorizacao;
import br.com.pucrs.tcc.ed.OrdemPriorizacao;
import br.com.pucrs.tcc.exception.AlunoException;
import br.com.pucrs.tcc.exception.CursoException;
import br.com.pucrs.tcc.util.hibernate.HibernateUtil;
//import java.util.List;
//import br.com.pucrs.tcc.bd.GrupoTrabalhoAreaInteresseBD;
//import br.com.pucrs.tcc.bd.GrupoTrabalhoBD;
//import br.com.pucrs.tcc.ed.GrupoTrabalho;
//import br.com.pucrs.tcc.ed.GrupoTrabalhoAreaInteresse;
//import br.com.pucrs.tcc.enumerator.SituacaoGrupoTrabalhoEnum;

@Stateless
public class CursoRNImpl implements CursoRN {

	private CursoBD mCursoBD;

	private ItemPriorizacaoBD mItemPriorizacaoBD;
	
	private OrdemPriorizacaoBD mOrdemPriorizacaoBD;

	@Override
	public ArrayList<Curso> lista() {
		ArrayList<Curso> listaRetorno = new ArrayList<Curso>();

		Session session = HibernateUtil.getSessionFactory().openSession();
		mCursoBD = new CursoBD(session);

		try {

			listaRetorno = mCursoBD.list(new Curso());

		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return listaRetorno;
	}

	@Override
	public boolean remover(Curso curso) throws CursoException {
		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		mCursoBD = new CursoBD(session);

		try {
			trns = session.beginTransaction();

			mCursoBD.delete(curso);

			session.getTransaction().commit();
		} catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
			return false;
		} finally {
			session.flush();
			session.close();
		}

		return true;
	}

	@Override
	public Curso obter(int id) {
		Curso curso = new Curso();

		Session session = HibernateUtil.getSessionFactory().openSession();
		mCursoBD = new CursoBD(session);

		try {

			curso.setId(id);
			curso = mCursoBD.retrieve(curso);

		} finally {
			session.flush();
			session.close();
		}

		return curso;
	}

	@Override
	public Curso salvar(Curso curso) throws CursoException {
		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		mCursoBD = new CursoBD(session);

		try {
			trns = session.beginTransaction();
			if (curso.getId() == null || curso.getId().equals(0)) {
				curso.setId(0);
				mCursoBD.insert(curso);
			} else {
				mCursoBD.update(curso);
			}
			session.getTransaction().commit();
		} catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return curso;
	}

	@Override
	public boolean salvarPriorizacao(Curso curso, ArrayList<ItemPriorizacao> itens) {
		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		mOrdemPriorizacaoBD = new OrdemPriorizacaoBD(session);

		try {
			trns = session.beginTransaction();
			
			//Exclui ordem antiga
			mOrdemPriorizacaoBD.deletePorCurso(curso);
			
			//Cadastra nova ordem
			for(int i = 0; i < itens.size(); i++) {
				OrdemPriorizacao ordem = new OrdemPriorizacao();
				ordem.setCurso(curso);
				ordem.setItemPriorizacao(itens.get(i));
				ordem.setOrdem(i + 1);
				
				mOrdemPriorizacaoBD.insert(ordem);
			}

			session.getTransaction().commit();
		} catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return true;
	}

	@Override
	public List<ItemPriorizacao> listaOrdemPriorizacao(Curso curso) {
		ArrayList<ItemPriorizacao> listaRetorno = new ArrayList<ItemPriorizacao>();

		Session session = HibernateUtil.getSessionFactory().openSession();
		mItemPriorizacaoBD = new ItemPriorizacaoBD(session);

		try {

			listaRetorno = mItemPriorizacaoBD.listaItensPorCurso(curso);

			if (listaRetorno == null || listaRetorno.size() <= 0) {
				listaRetorno = mItemPriorizacaoBD.lista();
			}

		} finally {
			session.flush();
			session.close();
		}

		return listaRetorno;
	}

}
